﻿using Stankovita.Model;
using System;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Navigation;
using System.Windows.Threading;

namespace Stankovita.Program.Pages
{
    /// <summary>
    /// Логика взаимодействия для View.xaml
    /// </summary>
    public partial class View : Page
    {
        // Экземпляр таймера для блокироки доступа, если вход был совершен через капчу
        readonly DispatcherTimer timer = new DispatcherTimer();
        
        public View()
        {
            InitializeComponent();

            // Выдача доступа на 10 секунд пользователю, который вошел с капчей
            if (GlobalVaribles.captchaLogin == true)
            {
                AddOrderBtn.Visibility = Visibility.Hidden;
                timer.Tick += new EventHandler(OpenPage_ConnectMode);
                timer.Interval = new TimeSpan(0, 0, 10);
                timer.Start();
            }    

            // Перекидываем имя пользователя
            NameUserLb.Content = GlobalVaribles.nameUser;

            // Передача данных в ComboBox скидки
            FilterDiscountCmbx.Items.Add("Все");
            FilterDiscountCmbx.Items.Add("от 0 до 5%");
            FilterDiscountCmbx.Items.Add("от 5% до 15%");
            FilterDiscountCmbx.Items.Add("от 15% до 30%");
            FilterDiscountCmbx.Items.Add("от 30% до 70%");
            FilterDiscountCmbx.Items.Add("от 70% до 100%");

            // Загружаем все таблицы
            dGridCustomers.ItemsSource = Entities.GetContext().Customers.ToList();
            dGridManufactures.ItemsSource = Entities.GetContext().Manufactures.ToList();
            dGridOrders.ItemsSource = Entities.GetContext().Orders.ToList();

            // Выбор конфигурации в зависимости от пользователя
            switch (GlobalVaribles.typeUser)
            {
                case 0: // гость
                    SwitchOnManufacturesTableBtn.IsEnabled = true;
                    NameUserLb.Background = System.Windows.Media.Brushes.Black;
                    NameUserLb.Foreground = System.Windows.Media.Brushes.White;
                    break;
                case 1: // заказчик
                    SwitchOnCustomersTableBtn.IsEnabled = true;
                    SwitchOnManufacturesTableBtn.IsEnabled = true;
                    SwitchOnOrdersTableBtn.IsEnabled = true;
                    NameUserLb.Background = System.Windows.Media.Brushes.Azure;
                    NameUserLb.Foreground = System.Windows.Media.Brushes.Black;
                    break;
                case 2: // админ
                    SwitchOnCustomersTableBtn.IsEnabled = true;
                    SwitchOnManufacturesTableBtn.IsEnabled = true;
                    SwitchOnOrdersTableBtn.IsEnabled = true;
                    OpenUsersLogBtn.Visibility = Visibility.Visible;
                    EditorMachineBtn.Visibility = Visibility.Visible;
                    EditorOrderBtn.Visibility = Visibility.Visible;
                    NameUserLb.Background = System.Windows.Media.Brushes.BlanchedAlmond;
                    NameUserLb.Foreground = System.Windows.Media.Brushes.Black;
                    break;
            }
        }

        // Метод открытия страницы подключения после истечения времени
        public void OpenPage_ConnectMode(object source, EventArgs e)
        {
            NavigationService.Navigate(new ConnectMode());
            timer.Stop();
            GlobalVaribles.captchaLogin = false;
            MessageBox.Show("Время вышло! Выход на главную страницу.");
        }

        // Возврат на страницу подключений
        private void BackBtn_Click(object sender, RoutedEventArgs e)
        {
            SwitchOnCustomersTableBtn.IsEnabled = false;
            SwitchOnManufacturesTableBtn.IsEnabled = false;
            SwitchOnOrdersTableBtn.IsEnabled = false;
            OpenUsersLogBtn.Visibility = Visibility.Hidden;
            EditorMachineBtn.Visibility = Visibility.Hidden;
            EditorOrderBtn.Visibility = Visibility.Hidden;

            // Фиксация времени работы пользователя
            GlobalVaribles.timeLogout = DateTime.Now;
            TimeSpan timeWork = GlobalVaribles.timeLogout.Subtract(GlobalVaribles.timeLogin);

            var recordLog = new Model.Logs();
            try
            {
                recordLog.loginUser = GlobalVaribles.nameUser;
                recordLog.timeLogin = GlobalVaribles.timeLogin;
                recordLog.timeLogout = GlobalVaribles.timeLogout;
                recordLog.timeWork = timeWork.ToString();
                Entities.GetContext().Logs.Add(recordLog);
                Entities.GetContext().SaveChanges();
            }
            catch (Exception ex)
            { MessageBox.Show(ex.Message); }

            NavigationService.Navigate(new ConnectMode());
        }

        // Переключиться на таблицу станков
        private void SwitchOnManufacturesTableBtn_Click(object sender, RoutedEventArgs e)
        {
            // Скрытие ненужных элементов
            GridTableCustomers.Visibility = Visibility.Hidden;
            GridTableOrders.Visibility = Visibility.Hidden;
            AddOrderBtn.Visibility = Visibility.Hidden;
            DeleteCustomerBtn.Visibility = Visibility.Hidden;
            DeleteOrderBtn.Visibility = Visibility.Hidden;

            // Отображение нужных элементов
            if (GlobalVaribles.typeUser == 2)
            {
                GridTableManufactures.Visibility = Visibility.Visible;
                AddMachineBtn.Visibility = Visibility.Visible;
                DeleteMachineBtn.Visibility = Visibility.Visible;
            }
            else
                GridTableManufactures.Visibility = Visibility.Visible;
        }

        // Переключиться на таблицу заказов
        private void SwitchOnOrdersTableBtn_Click(object sender, RoutedEventArgs e)
        {
            // Скрытие ненужных элементов
            GridTableCustomers.Visibility = Visibility.Hidden;
            GridTableManufactures.Visibility = Visibility.Hidden;
            AddMachineBtn.Visibility = Visibility.Hidden;
            DeleteCustomerBtn.Visibility = Visibility.Hidden;
            DeleteMachineBtn.Visibility = Visibility.Hidden;

            // Отображение нужных элементов
            if (GlobalVaribles.typeUser == 2)
            {
                GridTableOrders.Visibility = Visibility.Visible;
                AddOrderBtn.Visibility = Visibility.Visible;
                DeleteOrderBtn.Visibility = Visibility.Visible;
            }
            else if (GlobalVaribles.typeUser == 1)
            {
                GridTableOrders.Visibility = Visibility.Visible;
                if (GlobalVaribles.captchaLogin == false)
                    AddOrderBtn.Visibility = Visibility.Visible;
            }
            else
                GridTableOrders.Visibility = Visibility.Visible;
        }

        // Переключиться на таблицу заказчиков
        private void SwitchOnCustomersTableBtn_Click(object sender, RoutedEventArgs e)
        {
            // Скрытие ненужных элементов
            GridTableOrders.Visibility = Visibility.Hidden;
            GridTableManufactures.Visibility = Visibility.Hidden;
            AddMachineBtn.Visibility = Visibility.Hidden;
            AddOrderBtn.Visibility = Visibility.Hidden;
            DeleteMachineBtn.Visibility = Visibility.Hidden;
            DeleteOrderBtn.Visibility = Visibility.Hidden;

            // Отображение нужных элементов
            if (GlobalVaribles.typeUser == 2)
            {
                GridTableCustomers.Visibility = Visibility.Visible;
                DeleteCustomerBtn.Visibility = Visibility.Visible;
            }
            else
                GridTableCustomers.Visibility = Visibility.Visible;
        }

        /* ФУНКЦИИ РАЗДЕЛА "СТАНКИ" */

        // Изменение записи
        private void EditMachineBtn_Click(object sender, RoutedEventArgs e)
        {
            NavigationService.Navigate(new AddEditPages.AddEditManufactures((sender as Button).DataContext as Manufactures));
        }

        // Добавление записи
        private void AddMachineBtn_Click(object sender, RoutedEventArgs e)
        {
            NavigationService.Navigate(new AddEditPages.AddEditManufactures(null));
        }

        // Удаление записи
        private void DeleteMachineBtn_Click(object sender, RoutedEventArgs e)
        {
            // Передача выбранного элемента из списка записей
            var select_machine = dGridManufactures.SelectedItems.Cast<Manufactures>().ToList();
            
            // Передача выбранного элемента с типом класса
            var record_machine = dGridManufactures.SelectedItem as Manufactures;

            if (select_machine.Count != 0)
            {
                if (MessageBox.Show("Вы уверены что хотите удалить станок?", "Внимание",
                                    MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes)
                {
                    try // Проверка на ссылочную целостность
                    {
                        var _exist = (from structOrders in Entities.GetContext().Orders
                                      where structOrders.ID_machine == record_machine.ID_machine
                                      select structOrders).First();
                        if (_exist != null)
                        {
                            MessageBox.Show("Станок удалить нельзя!\nСуществует связь с таблицей заказов!", "Ошибка",
                                        MessageBoxButton.OK, MessageBoxImage.Error);
                            return;
                        }
                    } 
                    catch
                    {
                        try
                        {
                            Entities.GetContext().Manufactures.RemoveRange(select_machine);
                            Entities.GetContext().SaveChanges();
                            dGridManufactures.ItemsSource = Entities.GetContext().Manufactures.ToList();
                            MessageBox.Show("Данные успешно удалены!");
                        } catch (Exception ex)
                        { MessageBox.Show(ex.Message); }
                    }
                }
            }
            else
                MessageBox.Show("Вы не выбрали элемент из списка!");
        }

        // Поиск записи по названию
        private void SearchMachineTxb_TextChanged(object sender, TextChangedEventArgs e)
        {
            Update();
        }

        // Фильтр скидки
        private void FilterDiscountCmbx_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            Update();
        }

        // Одновременная работа поиска и фильтра
        public void Update()
        {
            var machineList = Entities.GetContext().Manufactures.ToList();

            if (FilterDiscountCmbx.SelectedIndex == 1)
                machineList = machineList.Where(p => p.discount >= 0 && p.discount < 5).ToList();
            if (FilterDiscountCmbx.SelectedIndex == 2)
                machineList = machineList.Where(p => p.discount >= 5 && p.discount < 15).ToList();
            if (FilterDiscountCmbx.SelectedIndex == 3)
                machineList = machineList.Where(p => p.discount >= 15 && p.discount < 30).ToList();
            if (FilterDiscountCmbx.SelectedIndex == 4)
                machineList = machineList.Where(p => p.discount >= 30 && p.discount < 70).ToList();
            if (FilterDiscountCmbx.SelectedIndex == 5)
                machineList = machineList.Where(p => p.discount >= 70 && p.discount < 100).ToList();

            machineList = machineList.Where(p =>
                                            p.nameMachine.ToLower().Contains(SearchMachineTxb.Text.ToLower())).ToList();

            dGridManufactures.ItemsSource = machineList.ToList();
        }

        /* ФУНКЦИИ РАЗДЕЛА "ЗАКАЗЫ" */

        // Изменение записи
        private void EditOrderBtn_Click(object sender, RoutedEventArgs e)
        {
            NavigationService.Navigate(new AddEditPages.AddEditOrders((sender as Button).DataContext as Orders));
        }

        // Добавление записи
        private void AddOrderBtn_Click(object sender, RoutedEventArgs e)
        {
            NavigationService.Navigate(new AddEditPages.AddEditOrders(null));
        }

        // Удаление записи
        private void DeleteOrderBtn_Click(object sender, RoutedEventArgs e)
        {
            var select_order = dGridOrders.SelectedItems.Cast<Orders>().ToList();

            if (select_order.Count != 0)
            {
                if (MessageBox.Show("Вы точно хотите удалить выбранные элементы?",
                                    "Внимание", MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes)
                {
                    try
                    {
                        Entities.GetContext().Orders.RemoveRange(select_order);
                        Entities.GetContext().SaveChanges();
                        dGridOrders.ItemsSource = Entities.GetContext().Orders.ToList();
                        MessageBox.Show("Данные успешно удалены!");
                    }
                    catch (Exception ex)
                    { MessageBox.Show(ex.Message); }
                }
            }
            else
                MessageBox.Show("Не выбран элемент из списка!");
        }

        /* ФУНКЦИИ РАЗДЕЛА "ЗАКАЗЧИКИ" */

        // Удаление закачика
        private void DeleteCustomerBtn_Click(object sender, RoutedEventArgs e)
        {
            var select_customer = dGridCustomers.SelectedItems.Cast<Customers>().ToList();
            var record_customer = dGridCustomers.SelectedItem as Customers;

            if (select_customer.Count != 0)
            {
                if (MessageBox.Show("Вы точно хотите удалить эту запись?", "Внимание",
                                    MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes)
                {
                    try // Проверка на ссылочную целостность
                    {
                        var _exist = (from structOrder in Entities.GetContext().Orders
                                      where structOrder.ID_customer == record_customer.ID_customer
                                      select structOrder).First();

                        if (_exist != null)
                        {
                            MessageBox.Show("Заказчика удалить нельзя!\nСуществует связь с таблицей заказов!",
                                            "Ошибки", MessageBoxButton.OK, MessageBoxImage.Error);
                            return;
                        }
                    }
                    catch
                    {
                        try
                        {
                            Entities.GetContext().Customers.RemoveRange(select_customer);
                            Entities.GetContext().SaveChanges();
                            dGridCustomers.ItemsSource = Entities.GetContext().Customers.ToList();
                            MessageBox.Show("Данные успешно удалены!");
                        } catch (Exception ex)
                        { MessageBox.Show(ex.Message); }
                    }
                }
            }
            else
                MessageBox.Show("Выберите элемент из списка");
        }

        // Поиск
        private void SearchOrganizTxb_TextChanged(object sender, TextChangedEventArgs e)
        {
            var customerList = Entities.GetContext().Customers.ToList();

            customerList = customerList.Where(p =>
                                              p.nameOrganiz.ToLower().Contains(SearchOrganizTxb.Text.ToLower())).ToList();

            dGridCustomers.ItemsSource = customerList.ToList();
        }

        // Переход на страницу логов
        private void OpenUsersLog_Click(object sender, RoutedEventArgs e)
        {
            NavigationService.Navigate(new UsersLogs());
        }
    }
}
